import router from '@/router';
import nprogress from 'nprogress';
import 'nprogress/nprogress.css'; // progress bar style
import { getToken } from './utils/auth';
import store from '@/store';
import { ElMessage } from 'element-plus';

nprogress.configure({ showSpinner: false });

const whiteList = ['/login']; // 白名单
router.beforeEach(async (to) => {
  nprogress.start();
  const hasToken = getToken();
  debugger;
  if (hasToken) {
    // 有token代表已登录
    if (to.path === '/login') {
      // 已经登录过得再进登录页就跳到首页
      nprogress.done();
      return {
        path: '/',
        replace: true
      };
    } else {
      try {
        const hasRoles = store.getters.roles && store.getters.roles.length > 0;
        if (hasRoles) {
          nprogress.done();
          return true;
        }
        // 无用户信息和角色信息 就请求获取
        const roles = await store.dispatch('user/getUserInfo');

        // 该用户未分配角色 进行异常提示
        if (!roles || roles.length === 0) {
          throw new Error('该用户未分配角色');
        }

        // 获取权限路由, 超级管理员给全部，其他从接口获取
        const accessRoutes = await store.dispatch('permission/generateRoutes');
        // 动态注册路由
        accessRoutes.forEach(router.addRoute);
        console.log('router----------', router);

        // 触发重定向
        return to.fullPath;
      } catch (error) {
        // 登录失败处理
        // 移除token重新登录
        await store.dispatch('user/resetToken');
        ElMessage.error('登录失败：' + (error.message || 'Has Error'));
        nprogress.done();
        return `/login?redirect=${to.path}`;
      }
    }
  } else {
    if (whiteList.includes(to.path)) {
      nprogress.done();
      return true;
    }
    nprogress.done();
    return {
      path: '/login',
      query: {
        redirect: to.path,
        ...to.query
      }
    };
  }
});

router.afterEach(() => {
  nprogress.done();
});
